unit sweda;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Com1: TRadioButton;
    Com2: TRadioButton;
    com3: TRadioButton;
    Com4: TRadioButton;
    Com5: TRadioButton;
    GroupBox2: TGroupBox;
    Va: TRadioButton;
    Vb: TRadioButton;
    vc: TRadioButton;
    vd: TRadioButton;
    Ve: TRadioButton;
    Panel2: TPanel;
    Button9: TButton;
    StatusBar1: TStatusBar;
    GroupBox3: TGroupBox;
    Button1: TButton;
    Button4: TButton;
    Button6: TButton;
    GroupBox5: TGroupBox;
    Button7: TButton;
    Button5: TButton;
    GroupBox4: TGroupBox;
    Button2: TButton;
    Button3: TButton;
    Button8: TButton;
    Button10: TButton;
    Button11: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
  private
    { Private declarations }
        Function EnviaComando(Comando:Pchar):Integer;
        Function VerificaStatus:Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  com,a:integer;
  Resp:String;
  Retorno:Integer;
  Comando: array[0..512] of Char;
  Status:array[0..512] of Char;
  COO: String;
  Extensao:LongInt;
  Contador,ContadorECF:integer;
  CupomAberto:Boolean;
  function ECFOpen(numero,tempo,log,mostra:integer):integer; stdcall; external 'SWECF.DLL'    ;
  procedure ECFClose; stdcall; external 'SWECF.DLL'   ;
  function ECFWrite(Comando:PChar):longint; stdcall; external 'SWECF.DLL'  ;
  Function ECFRead(Status:PChar;Extensao:longint):Longint;stdcall; external 'SWECF.DLL' ;
  Procedure SistemaGetVersion(Versao:pchar);stdcall; external 'SWECF.DLL'  ;

implementation

{$R *.DFM}


procedure TForm1.Button1Click(Sender: TObject);
begin
     contador:=0;
     STrPcopy(Comando,#27+'.13N}');
     ContadorECF:=EnviaComando(Comando);
     if contadorECF<1 then
        StatusBar1.Panels[1].Text:='Falha na Leitura X '+ Status; Refresh;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
     EcfClose;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
     StrCopy(Comando,#27+'.28}');
     ContadorECF:=EnviaComando(Comando);
     if contadorECF=-1 then StatusBar1.Panels[1].Text:='Falha Status 28 '
     else StatusBar1.Panels[1].Text:=Status;
     Refresh;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
     StrCopy(Comando,#27+'.23}');
     ContadorECF:=EnviaComando(Comando);
     if contadorECF=-1 then StatusBar1.Panels[1].Text:='Falha Status 23 '
     else StatusBar1.Panels[1].Text:=Status;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
     StrPCopy(Comando,#27 + '.16'+ formatdatetime('ddmmyy',date()) +formatdatetime('ddmmyy',date()) +'}');
     ContadorECF:=EnviaComando(Comando);
     if contadorECF<1 then
        StatusBar1.Panels[1].Text:='Falha na Leitura MF '+ Status; Refresh;

end;

procedure TForm1.Button5Click(Sender: TObject);
var TotaldoCupom:String;
begin
     contador:=0;

     // abre cupom
     Comando:=#27+'.17}';
     ContadorECF:= EnviaComando(Comando);
     if  ContadorECF = Contador + 1 then begin
             Contador:=Contador+1;
             Cupomaberto:=true;
     end
     else if ContadorECF=0 then CupomAberto:=False;
     if CupomAberto then begin // se o cupom está aberto pode regitrar itens
            While True do begin
             //Envia item
                     Comando:=#27+'.0100000000000010001000000000100000000000100mkjnhuiopuytgfdreswdxcvgI  }';
                     ContadorECF:=EnviaComando(Comando);
                     if not (ContadorECF=Contador+1) then
                     begin
                        StatusBar1.Panels[1].Text:='Aguarde ... Registrando item '+InttoStr(contador); Refresh;
                        if contadorECF=-1 then begin
                           StatusBar1.Panels[1].Text:='Falha no registro '+InttoStr(contador); Refresh;
                           Break;
                        end
                        else if contadorECF=0 then begin
                           StatusBar1.Panels[1].Text:='Verifique impressora '+Status; Refresh;
                           Break;
                        end
                     end
                     else Contador:=Contador+1;
                     if contador=11 then break;
             end;

             if ContadorECF>0 then begin
             TotaldoCupom:=#0;
             while True do begin
                     Comando:=#27+'.28}';
                     EnviaComando(Comando);
                     TotaldoCupom:=Copy(status,22,12);
                     if contadorECF=-1 then begin
                        StatusBar1.Panels[1].Text:='Falha na captura do total '+ Status; Refresh;
                        ContadorECF:=0;
                        Break;
                     end;
                     try
                             if strtoint(totaldoCupom)>0 then break
                     except
                          ContadorECF:=0;
                          break;
                     end

             end;
             end;

             if ContadorECF>0 then begin
             while true do begin
                     //Totaliza Cupom

                     StrPCopy(Comando,#27+'.1001'+totaldocupom+'}');
                     ContadorECF:=EnviaComando(Comando);
                     if not (ContadorECF=Contador+1) then
                     begin
                        StatusBar1.Panels[1].Text:='Aguarde ... Totalizando '; Refresh;
                        if contadorECF=-1 then begin
                           StatusBar1.Panels[1].Text:='Falha na Totalização '+ Status; Refresh;
                           Break;
                        end
                     end
                     else begin
                        Contador:=Contador+1;
                        break;
                     end;

             end
             end;

             if ContadorECF>0 then begin
             while true do begin
                    Comando:=#27+'.12}';                         //Fecha documento
                    ContadorECF:=EnviaComando(Comando);

                     if ContadorECF= Contador + 1 then  begin
                        Cupomaberto:=false;
                        break
                     end
                     else if contadorECF<1 then begin
                           StatusBar1.Panels[1].Text:='Falha no Fechamento '+ Status; Refresh;
                           break;
                     end;
             end;
             end;

     end;
     Refresh;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
     Comando:=#27+'.14N}';
     ContadorECF:=EnviaComando(Comando);
     if contadorECF<1 then
        StatusBar1.Panels[1].Text:='Falha na Redução Z '+ Status; Refresh;

end;

procedure TForm1.Button7Click(Sender: TObject);
begin
     Comando:=#27+'.05}';
     ContadorECF:=EnviaCOmando(Comando);
     if contadorECF<1 then
        StatusBar1.Panels[1].Text:='Falha no Cancelamento de Cupom '+ Status; Refresh;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
     StrCopy(Comando,#27+'.271}');
     ContadorECF:=EnviaComando(Comando);
     if contadorECF=-1 then StatusBar1.Panels[1].Text:='Falha Status 27 '
     else StatusBar1.Panels[1].Text:=Status;
     end;

procedure TForm1.Button9Click(Sender: TObject);
var porta, velocidade, resposta: integer;
begin
        EcfClose;
        Panel2.Caption:='Aguarde ...'; Refresh;

        if com1.checked then Porta:=1
        else if com2.checked then Porta:=2
        else if com3.checked then Porta:=3
        else if com4.checked then Porta:=4
        else if com5.checked then Porta:=5;

        if va.checked then Velocidade:=9600
        else if vb.checked then Porta:=19200
        else if vc.checked then Porta:=38400
        else if vd.checked then Porta:=57600
        else if ve.checked then Porta:=115200;

        resposta:= ECFOpen(Porta,5,1,0);

        if (resposta = 0) then
                Panel2.Caption:='Porta Aberta = '+ inttostr(porta)
        else Panel2.Caption:='Falha na abertura da porta';
        Refresh;

end;

procedure TForm1.FormActivate(Sender: TObject);
var    versao:Array[0..256] of char;
begin
        versao:=#0; contador:=0;
        SistemaGetVersion(Versao);
        Form1.Caption:='Aplicativo Teste - '+ versao; Refresh;
        Cupomaberto:=false;
end;


Function TForm1.EnviaComando(Comando:Pchar):Integer;
var contvalido:integer;
begin

     case strtoint(copy(comando,3,2)) of
     01: StatusBar1.Panels[0].text:='Item';
     05: StatusBar1.Panels[0].text:='Cancela Cupom';
     10: StatusBar1.Panels[0].text:='Total Cupom';
     12: StatusBar1.Panels[0].text:='Fecha Cupom';
     13: StatusBar1.Panels[0].text:='Leitura X';
     14: StatusBar1.Panels[0].text:='Redução Z';
     16: StatusBar1.Panels[0].text:='Leitura MF';
     17: StatusBar1.Panels[0].text:='Abre Cupom Fiscal';
     23: StatusBar1.Panels[0].text:='Status 23';
     27: StatusBar1.Panels[0].text:='Status 27';
     28: StatusBar1.Panels[0].text:='Status 28';
     end;
     Refresh;

     Retorno:=ECFWrite(Comando);
     ECFRead(Status,512);

     StatusBar1.Panels[1].Text:=Status;
     Refresh;

//     if (status = '.-P002}') or  (status = '.-P006') then begin // Time-out Transmissao
     if (status = '.-P002}')then begin // Time-out Transmissao
        StatusBar1.Panels[1].Text:=Status+' Time-out Transmissao de comando.';
        Refresh;

        ContValido:=VerificaStatus;
        EnviaComando:=ContValido;

     end
     else if  (status = '.-P006}') then begin // Time-out Recepcao
        StatusBar1.Panels[1].Text:=Status+' Time-out Recepcao de comando.';
        Refresh;

        ContValido:=VerificaStatus;
        EnviaComando:=ContValido;

     end


     else if copy(status,1,2) =  '.-' then  begin  //Retorno de ERRO
        StatusBar1.Panels[1].Text:=Status;
        Refresh;
        EnviaComando := 0
     end

     else if copy(status,1,2) = '.+' then   begin // Retorno OK, necessario verificar contador
                StatusBar1.Panels[1].Text:=Status;
                Refresh;
             case strtoint(copy(comando,3,2)) of
             23: EnviaComando:=StrToINt(copy(status,9,4));
             27: EnviaComando:=Contador;
             else
                     EnviaComando:=StrToINt(copy(status,3,4));
             end


     end
     else EnviaComando := 0;
end;

Function TForm1.VerificaStatus:Integer;
var repeticao:integer;
begin
     verificastatus:=0;
     repeticao:=0;
     While true do begin
             repeticao:=repeticao+1;
             StatusBar1.Panels[1].Text:='Aguarde. Tentativa ' + inttostr(repeticao); Refresh;

             StrCopy(Comando,#27+'.28}'); // Envia comando de status para obter o sequencial de sincronismo.
             Retorno:=ECFWrite(Comando);
             ECFRead(Status,512);

             if copy(status,1,2)='.+' then begin // retorno do comando
                  VerificaStatus:=StrToInt(copy(status,3,4));
                  break;
             end;
             if (repeticao = 3) then begin
                 VerificaStatus:=-1;
                 break;
             end;
     end;
     StatusBar1.Panels[1].Text:=''; Refresh;
end;

procedure TForm1.Button10Click(Sender: TObject);
begin
        StrCopy(Comando,#27+'.13S}'); // Envia comando de status para obter o sequencial de sincronismo.
        ContadorECF:=EnviaComando(Comando);

        if contadorECF<1 then begin
                StatusBar1.Panels[1].Text:='Falha no Relatório Gerencial '+ Status;
                Refresh;
        end
        else begin
                StrCopy(Comando,#27+'.0812345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901'+'12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901'+'12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901}');
                ContadorECF:=EnviaComando(Comando);
                StatusBar1.Panels[1].Text:=Status;

                StrCopy(Comando,#27+'.0812345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901'+'12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901'+'12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901}');
                ContadorECF:=EnviaComando(Comando);
                StatusBar1.Panels[1].Text:=Status;
        end;
        StrCopy(Comando,#27+'.12}'); // Envia comando de status para obter o sequencial de sincronismo.
        ContadorECF:=EnviaComando(Comando);
end;

procedure TForm1.Button11Click(Sender: TObject);
begin
StrCopy(Comando,#27+'.27H}');
     ContadorECF:=EnviaComando(Comando);
     if contadorECF=-1 then StatusBar1.Panels[1].Text:='Falha Status 27 '
     else StatusBar1.Panels[1].Text:=Status;
     COO:= Copy(Status, 73,6);
     ShowMessage(COO);
     
end;

end.
